package principal;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Markus
 */
public class JIFUsuarios extends javax.swing.JInternalFrame {

    /**
     * Creates new form JIFUsuarios
     */
    public JIFUsuarios() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTUsuarios = new javax.swing.JTable();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jTFUsuario = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jTFPass = new javax.swing.JTextField();
        jBAgregar = new javax.swing.JButton();
        jBActualizar = new javax.swing.JButton();
        jBEliminar = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        jTFNombre = new javax.swing.JTextField();
        jBCancelar = new javax.swing.JButton();

        setClosable(true);
        addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
            public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt) {
                formInternalFrameClosed(evt);
            }
            public void internalFrameClosing(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameOpened(javax.swing.event.InternalFrameEvent evt) {
            }
        });
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                formComponentShown(evt);
            }
        });

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Listado de Personal"));

        jTUsuarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Usuario", "Contraseña", "Nombre"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTUsuarios.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jTUsuarios.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTUsuariosMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(jTUsuarios);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE)
                    .addContainerGap()))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 208, Short.MAX_VALUE)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 186, Short.MAX_VALUE)
                    .addContainerGap()))
        );

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Datos del Personal"));

        jLabel1.setText("Usuario:");

        jLabel2.setText("Contraseña:");

        jBAgregar.setText("Agregar");
        jBAgregar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBAgregarActionPerformed(evt);
            }
        });

        jBActualizar.setText("Modificar");
        jBActualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBActualizarActionPerformed(evt);
            }
        });

        jBEliminar.setText("Eliminar");
        jBEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBEliminarActionPerformed(evt);
            }
        });

        jLabel3.setText("Nombre");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jTFUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jTFPass))
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jBAgregar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel2Layout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jTFNombre))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                                .addGap(115, 115, 115)
                                .addComponent(jBActualizar)
                                .addGap(75, 75, 75)
                                .addComponent(jBEliminar)))))
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTFUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2)
                    .addComponent(jTFPass, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(23, 23, 23)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jTFNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 22, Short.MAX_VALUE)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jBAgregar)
                    .addComponent(jBActualizar)
                    .addComponent(jBEliminar))
                .addContainerGap())
        );

        jBCancelar.setText("Cancelar");
        jBCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBCancelarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jBCancelar)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(jBCancelar)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void formInternalFrameClosed(javax.swing.event.InternalFrameEvent evt) {//GEN-FIRST:event_formInternalFrameClosed
        JFPrincipal.usuarios = null; //se asigna null a la variable que almacena la ventana actual
    }//GEN-LAST:event_formInternalFrameClosed

    private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown
         this.ActualizarListado(); //al momento de mostrar la ventana, se actualiza la lista de usuarios
    }//GEN-LAST:event_formComponentShown

    private void jBAgregarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBAgregarActionPerformed
        String user = jTFUsuario.getText();
        String pass = jTFPass.getText();
        String name = jTFNombre.getText();
        if (user.length() == 0 || pass.length() == 0 || name.length() == 0) //si algun cuadro de texto no tiene texto, se sale del metodo
        {
            JOptionPane.showMessageDialog(this, "Todos los campos son obligatorios.","Advertencia", JOptionPane.WARNING_MESSAGE);
            return;
        }
        try //Se hace la consulta para agregar un nuevo registro
        {            
            PreparedStatement pstm = JFPrincipal.con.getConnection().prepareStatement("insert into " + 
                    "personal(login_personal, clave_personal, nombre_personal, esta_activo) " +
                    " values(?,?,?,true);");            
            pstm.setString(1, user);
            pstm.setString(2, pass);
            pstm.setString(3, name);                                              
            pstm.execute();
            pstm.close();            
         }catch(SQLException e){
             System.out.println(e);
             JOptionPane.showMessageDialog(this, "No se han podido guardar los datos del usuario en la base de datos.","Error de Datos", JOptionPane.ERROR_MESSAGE);
             return;
         }
        this.Limpiar(); //Se limpian los cuadros de texto
        this.ActualizarListado(); //se actualiza la tabla con los registros
    }//GEN-LAST:event_jBAgregarActionPerformed

    private void jBActualizarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBActualizarActionPerformed
        //Se actualiza el registro seleccionado
        if (jTUsuarios.getSelectedRows().length == 0) //Si no se ha seleccionado nada, se sale del metodo
            return;
        int i = jTUsuarios.getSelectedRows()[0]; //Se obtiene la primera fila de la seleccion
        //Se obtienen los datos de los cuadros de texto
        String pass = jTFPass.getText();
        String name = jTFNombre.getText();
        if (pass.length() == 0 || name.length() == 0) //Si alguno de los cuadros no tiene texto, se sale del metodo
        {
            JOptionPane.showMessageDialog(this, "Todos los campos son obligatorios.","Advertencia", JOptionPane.WARNING_MESSAGE);
            return;
        }
        String user_sel = jTUsuarios.getValueAt(i, 0).toString(); //Se busca el login del usuario seleccionado en la tabla
        try {            
            PreparedStatement pstm = JFPrincipal.con.getConnection().prepareStatement("update personal " +
            "set clave_personal = ? ," +
            "nombre_personal = ? " +                                       
            "where login_personal = ? ;");            
            pstm.setString(1, pass);
            pstm.setString(2, name);                                              
            pstm.setString(3, user_sel);
            pstm.execute(); //se ejecuta la consulta
            pstm.close();            
         }catch(SQLException e){
             System.out.println(e);
             JOptionPane.showMessageDialog(this, "No se han podido modificar los datos del usuario en la base de datos.","Error de Datos", JOptionPane.ERROR_MESSAGE);
             return;
         }
        this.Limpiar(); //Se limpian los cuadros de texto
        this.ActualizarListado(); //se actualiza la tabla con los registros
    }//GEN-LAST:event_jBActualizarActionPerformed

    private void jBEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBEliminarActionPerformed
        //Al eliminar un usuario, no se elimina el registro, sino que su estado de activo se vuelve false
        if (jTUsuarios.getSelectedRows().length == 0) //Si no se ha seleccionado nada, se sale del metodo
            return;
        int i = jTUsuarios.getSelectedRows()[0]; //Se obtiene la primera fila de la seleccion
        String user_sel = jTUsuarios.getValueAt(i, 0).toString();
        try{               
            PreparedStatement pstm = JFPrincipal.con.getConnection().prepareStatement("update personal set esta_activo = false where login_personal = ?;");
            pstm.setString(1, user_sel);               
            pstm.execute();
            pstm.close();            
        }catch(SQLException e){
            System.out.println(e);
            JOptionPane.showMessageDialog(this, "No se ha podido eliminar el usuario en la base de datos.","Error de Datos", JOptionPane.ERROR_MESSAGE);
             return;
        }
        this.Limpiar(); //Se limpian los cuadros de texto
        this.ActualizarListado(); //se actualiza la tabla con los registros
    }//GEN-LAST:event_jBEliminarActionPerformed

    private void jBCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBCancelarActionPerformed
        //El boton Cancelar cierra la ventana actual
        this.Salir();
    }//GEN-LAST:event_jBCancelarActionPerformed

    private void jTUsuariosMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTUsuariosMouseClicked
        //Se obtienen los datos de la fila seleccionada
        if (jTUsuarios.getSelectedRows().length == 0) //Si no se ha seleccionado nada, se sale del metodo
            return;
        int i = jTUsuarios.getSelectedRows()[0]; //Se obtiene la primera fila de la seleccion
        //Se asignan a los cuadros de texto los valores de la fila seleccionada
        jTFUsuario.setText(jTUsuarios.getValueAt(i, 0).toString());
        jTFPass.setText(jTUsuarios.getValueAt(i, 1).toString());
        jTFNombre.setText(jTUsuarios.getValueAt(i, 2).toString());
        
        jTFUsuario.setEditable(false); //el identificador no se puede modificar
    }//GEN-LAST:event_jTUsuariosMouseClicked

    private void Limpiar()       
    {
        //Este metodo borra el texto de los cuadros de texto
        jTFUsuario.setText("");
        jTFPass.setText("");
        jTFNombre.setText("");
        jTFUsuario.setEditable(true); //el cuadro con el login de usuario se vuelve editable para ingresar nuevos datos
    }
    private void ActualizarListado()
    {
        //Se hace una consulta para recuperar a los usuarios activos
        try
         {
             PreparedStatement pstm = JFPrincipal.con.getConnection().prepareStatement("select * from personal where esta_activo = true;");
             ResultSet res = pstm.executeQuery(); //se ejecuta la consulta de los usuarios activos
             int i = 0; //contador de registros devueltos
             while(res.next()){ //se recorren los registros para tener el total 
                 i++;
             }
             System.out.println("numero de registros: " + i);
             res.first(); //se vuelve al primer registro
             Object[][] data = new String[i][3]; //se crea la matriz de datos para la tabla de usuarios
             for(int j = 0; j < i; j++) //se recorren los registros y se asignan a la matriz de datos
             {  
                 data[j][0] = res.getString("login_personal");   
                 data[j][1] = res.getString("clave_personal");          
                 data[j][2] = res.getString("nombre_personal");           
                 res.next();
             } 
             res.close(); 
             String[] columNames = {"Usuario","Contraseña","Nombre"}; //encabezados de la columnas de la tabla de usuarios
            //Se colocan los datos en una tabla de datos, sobreescribiendo el metodo isCellEditable
            //para que no se puedan modificar los datos manualmente
             DefaultTableModel datos = new DefaultTableModel(data,columNames){
                 @Override
                 public boolean isCellEditable(int row, int column) { return false; }
             };
             jTUsuarios.setModel(datos); //se asigna la tabla de datos al modelo de la tabla
             
         }catch(SQLException e){
             System.out.println(e);
             JOptionPane.showMessageDialog(this, "No se han podido cargar los datos de los usuario de la base de datos.","Error de Datos", JOptionPane.ERROR_MESSAGE);
         }
    }
    
    private void Salir()
    {
        this.setVisible(false);
        this.dispose();
        JFPrincipal.usuarios = null; //se asigna null a la variable que almacena la ventana actual
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jBActualizar;
    private javax.swing.JButton jBAgregar;
    private javax.swing.JButton jBCancelar;
    private javax.swing.JButton jBEliminar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField jTFNombre;
    private javax.swing.JTextField jTFPass;
    private javax.swing.JTextField jTFUsuario;
    private javax.swing.JTable jTUsuarios;
    // End of variables declaration//GEN-END:variables
}
